// 在布局元素中创建 WebView
package main

import (
	_ "embed"
	"fmt"
	app "gitee.com/go_888/xcgui/xcgui/app"
	edge "gitee.com/go_888/xcgui/xcgui/edge"
	widget "gitee.com/go_888/xcgui/xcgui/widget"
	window "gitee.com/go_888/xcgui/xcgui/window"
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
	"math/rand"
	"strconv"
	"strings"
	"time"
)

//go:embed main.xml
var xmlStr string

func main() {
	a := app.X创建(true)
	a.X启用自动DPI(true).X启用DPI(true)

	// 创建窗口
	w := window.X创建窗口并按布局文件文本W(xmlStr, 0, 0)
	w.X设置透明度(255)

	// 放置 WebView 的布局元素
	layoutWV := widget.X创建布局并按名称("布局WV")

	// 创建 WebView
	wv := createWV(layoutWV)

	// 按钮_隐藏
	btnHide := widget.X创建按钮并按名称("按钮_隐藏")
	btnHide.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		btnHide.X启用(false).X重绘(false)
		defer btnHide.X启用(true).X重绘(false)
		if !xc.X判断元素(layoutWV.X句柄) {
			xc.X弹框("提示", "布局元素不存在")
		}
		isShow := layoutWV.X判断显示()
		if isShow {
			btnHide.X设置文本("显示")
		} else {
			btnHide.X设置文本("隐藏")
		}
		layoutWV.X显示(!isShow)
		layoutWV.X重绘(false)
		return 0
	})

	// 编辑框_地址栏
	editUrl := widget.X创建编辑框并按名称("编辑框_地址栏")
	// 按钮_跳转
	btnJump := widget.X创建按钮并按名称("按钮_跳转")
	// 按钮_JS测试
	btnJsTest := widget.X创建按钮并按名称("按钮_JS测试")

	// 跳转网页的函数
	jumpFunc := func() {
		btnJump.X启用(false).X重绘(false)
		defer btnJump.X启用(true).X重绘(false)
		addr := strings.TrimSpace(editUrl.X取文本Ex())
		if addr != "" {
			wv.X导航(addr)
		}
	}

	// 按钮_跳转事件
	btnJump.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		jumpFunc()
		return 0
	})

	// 编辑框_地址栏事件
	editUrl.X事件_按键按下1(func(hEle int, wParam, lParam uintptr, pbHandled *bool) int {
		if wParam == xcc.X按键_回车 { // 判断按下回车键
			jumpFunc()
		}
		return 0
	})

	// 按钮_JS测试事件
	btnJsTest.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		codeWindow := window.X创建窗口(0, 0, 600, 500, "测试JS代码", w.X取HWND句柄(), xcc.X窗口样式_默认样式)
		codeWindow.X启用布局(true)
		codeWindow.X设置垂直对齐(xcc.X布局对齐_顶部)
		// 代码框
		codeEdit := widget.X创建编辑框(0, 0, 0, 0, codeWindow.X句柄)
		codeEdit.X布局项设置宽度(xcc.X布局大小类型_填充父, -1)
		codeEdit.X布局项设置高度(xcc.X布局大小类型_百分比, 60)
		codeEdit.X设置文本("alert('Hello World')").X启用多行(true).X设置默认文本("请输入代码")
		codeWindow.X设置焦点(codeEdit.X句柄)
		// 选择框
		checkBox := widget.X创建按钮(0, 0, 0, 0, "获取返回值", codeWindow.X句柄)
		checkBox.X设置类型EX(xcc.X对象扩展类型_复选按钮).X启用背景透明(true)
		checkBox.X布局项设置宽度(xcc.X布局大小类型_填充父, -1)
		checkBox.X布局项设置高度(xcc.X布局大小类型_百分比, 8)
		// 输出框
		resultEdit := widget.X创建编辑框(0, 0, 0, 0, codeWindow.X句柄)
		resultEdit.X布局项设置宽度(xcc.X布局大小类型_填充父, -1)
		resultEdit.X布局项设置高度(xcc.X布局大小类型_百分比, 20)
		resultEdit.X启用只读(true).X启用多行(true).X设置默认文本("这里会输出结果").X启用自动显示滚动条(true)
		// 日志函数
		log := func(s string) {
			resultEdit.X移动到末尾()
			resultEdit.X添加文本(time.Now().Format("[15:04:05] ") + s + "\n").X滚动到底部()
			resultEdit.X重绘(false)
		}
		// 执行按钮
		btn := widget.X创建按钮(0, 0, 0, 0, "执行", codeWindow.X句柄)
		btn.X布局项设置宽度(xcc.X布局大小类型_填充父, -1)
		btn.X布局项设置高度(xcc.X布局大小类型_百分比, 12)
		btn.X事件_被单击1(func(hEle int, pbHandled *bool) int {
			code := strings.TrimSpace(codeEdit.X取文本Ex())
			if code != "" {
				if checkBox.X是否选中() { // 获取返回值
					{
						// 同步获取
						ret, err := wv.EvalSync(code)
						if err != nil {
							log("EvalSync, 返回错误: " + err.Error())
							return 0
						}
						log(fmt.Sprintf("EvalSync, js返回结果: %v", ret))
					}

					/*{
						// 异步获取
						if err := wv.EvalAsync(code, func(result interface{}, err error) {
							if err != nil {
								xc.XC_CallUT(func() {
									log("EvalAsync, js返回错误: " + err.Error())
								})
								return
							}
							xc.XC_CallUT(func() {
								log(fmt.Sprintf("EvalAsync, js返回结果: %v", result))
							})
						}); err != nil {
							xc.XC_CallUT(func() {
								log("EvalAsync, 报错: " + err.Error())
							})
						}
					}*/
				} else {
					wv.X执行js(code)
				}
			} else {
				codeWindow.X设置焦点(codeEdit.X句柄)
			}
			return 0
		})
		codeWindow.X显示(true)
		return 0
	})

	// 按钮_设置搜索关键词
	btnSetSearch := widget.X创建按钮并按名称("按钮_设置搜索关键词")
	// 按钮_设置搜索关键词事件
	rand.Seed(time.Now().UnixNano())
	words := []string{"腾讯视频", "优酷视频", "爱奇艺视频", "哔哩哔哩"}
	btnSetSearch.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		index := rand.Intn(len(words))
		wv.X执行js("document.querySelectorAll('#kw')[0].value = '" + words[index] + "'")
		return 0
	})
	// 按钮_点击搜索
	btnClickSearch := widget.X创建按钮并按名称("按钮_点击搜索")
	// 按钮_点击搜索事件
	btnClickSearch.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		wv.X执行js("document.querySelectorAll('#su')[0].click()")
		return 0
	})

	// 按钮_执行Go函数
	btnGoFunc := widget.X创建按钮并按名称("按钮_执行Go函数")
	// 按钮_执行Go函数事件
	btnGoFunc.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		wv.X执行js(`
			goAddStr('Hello World', 666).then(function(result) {
				alert(result);
			});
		`)
		return 0
	})

	// 按钮_刷新
	btnRefresh := widget.X创建按钮并按名称("按钮_刷新")
	// 按钮_刷新事件
	btnRefresh.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		wv.X刷新()
		return 0
	})

	// 按钮_打开vea
	btnOpenVea := widget.X创建按钮并按名称("按钮_打开vea")
	// 按钮_打开vea事件
	btnOpenVea.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		wv.X导航("https://panjiachen.github.io/vue-element-admin/")
		return 0
	})

	// 按钮_打开百度
	btnOpenBaidu := widget.X创建按钮并按名称("按钮_打开百度")
	// 按钮_打开百度事件
	btnOpenBaidu.X事件_被单击1(func(hEle int, pbHandled *bool) int {
		wv.X导航("https://www.baidu.com")
		return 0
	})

	w.X调整布局()
	w.X显示(true)
	a.X运行()
	a.X退出()
}

func createWV(layoutWV *widget.X结构_布局) *edge.Web视图 {
	edge窗口, _ := edge.X创建(edge.X选项{})
	wv, _ := edge窗口.X创建Web视图(layoutWV.X句柄, edge.Web视图选项{
		X开发者工具:      true,
		X填充父窗口: true,
	})

	// 绑定Go函数
	if err := wv.X绑定函数("goAddStr", func(str string, num int) string {
		fmt.Println("执行Go函数: goAddStr")
		return "传进Go函数 goAddStr 的参数: " + str + ", " + strconv.Itoa(num)
	}); err != nil {
		fmt.Println("绑定Go函数 goAddStr 失败:", err.Error())
	}

	// 绑定一个输出函数, 方便在js中调用
	if err := wv.X绑定函数("golog", func(a interface{}) {
		fmt.Printf("js输出: %v\n", a)
	}); err != nil {
		fmt.Println("绑定Go函数 golog 失败:", err.Error())
	}

	// 加载网页
	wv.X导航("https://www.baidu.com")
	return wv
}
